﻿using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Logic.Statistics;
using WebSite.ViewModels.Fields;

namespace WebSite.ViewModels.IndexViewModels
{
    public static class ProdutoIndexColumns
    {
        public static readonly Guid Codigo = new Guid("6df9c8c4-56f8-4ab6-9162-9aed44165797");
        public static readonly Guid Descricao = new Guid("159ec480-5208-46a4-89f6-b775572c8116");
        public static readonly Guid Quantidade = new Guid("e2ece5d3-d217-49b7-bd88-5436e3fdb7c2");
        public static readonly Guid SearchPedidosByProduto = new Guid("177698C4-EB90-44CD-95E7-61B2C96E8EF9");
    }

    public class ProdutoIndexViewModel : IndexViewModel<Produto>
    {
        private readonly ProdutoStatistics m_Statistics;
        private readonly bool m_CanViewPedido;

        public Dictionary<Guid, string> VendedorBusca { private get; set; }
        public Dictionary<Guid, string> FabricaBusca { private get; set; }
        public Dictionary<Guid, string> TransportadoraBusca { private get; set; }

        public int? NumeroBuscaValue { private get; set; }
        public string VendedorBuscaValue { private get; set; }
        public string ClienteBuscaValue { private get; set; }
        public string FabricaBuscaValue { private get; set; }
        public string TransportadoraBuscaValue { private get; set; }
        public DateTime? DeBuscaValue { private get; set; }
        public DateTime? AteBuscaValue { private get; set; }
        public string CodigoBuscaValue { private get; set; }
        public string DescricaoBuscaValue { private get; set; }

        public ProdutoIndexViewModel(bool canViewPedido, ProdutoStatistics statistics)
            : base("Produtos")
        {
            m_CanViewPedido = canViewPedido;
            m_Statistics = statistics;
        }

        protected override void RegisterColumns(IndexColumnDefinitionsCollectionWrapper<Produto> indexColumnDefinitionsCollectionWrapper)
        {
            indexColumnDefinitionsCollectionWrapper.Register(ProdutoIndexColumns.Codigo, x => x.Codigo);
            indexColumnDefinitionsCollectionWrapper.Register(ProdutoIndexColumns.Descricao, x => x.Descricao);
            indexColumnDefinitionsCollectionWrapper.Register(ProdutoIndexColumns.Quantidade, x => x.Quantidade);
            if (m_CanViewPedido)
            {
                Func<Produto, HtmlHelper, object> pedidoTemplate = (produto, htmlHelper) =>
                {
                    return htmlHelper.ActionLink("Pedidos", "Search", "Pedido", new { descricaoProduto = produto.Descricao }, null);
                };
                indexColumnDefinitionsCollectionWrapper.Register(ProdutoIndexColumns.SearchPedidosByProduto, pedidoTemplate);
            }
        }

        protected override IEnumerable<IField> GetSearchFields()
        {
            List<IField> result = new List<IField>
            {
                new TextBoxField("Número", "numero", NumeroBuscaValue),
                new TokenInputField("Vendedores", "vendedorIds", VendedorBuscaValue, "Search", "SearchVendedor", VendedorBusca),
                new AutoCompleteField("Clientes", "cliente", ClienteBuscaValue, "SearchCliente", "Search"),
                new TokenInputField("Fábricas", "fabricaIds", FabricaBuscaValue, "Search", "SearchFabrica", FabricaBusca),
                new TokenInputField("Transportadoras", "transportadoraIds", TransportadoraBuscaValue, "Search", "SearchTransportadora", TransportadoraBusca),
                new DatePickerField("De", "de", DeBuscaValue),
                new DatePickerField("Até", "ate", AteBuscaValue),
                new TextBoxField("Codigo", "codigo", CodigoBuscaValue),
                new TextBoxField("Descricao", "descricao", DescricaoBuscaValue),
            };
            result.AddRange(base.GetSearchFields());
            return result;
        }

        protected override IEnumerable<TabItem> GetTabs(HtmlHelper htmlHelper)
        {
            List<TabItem> result = new List<TabItem>
            {
                new TabItem("Estatísticas", "~/Content/statistics.png", new FormLayoutViewModel(htmlHelper)
                    .AddField(new LabelField("Quantidade Total", "quantitadeTotal", m_Statistics.QuantidadeTotal))
                    .AddField(new LabelField("Total", "total", m_Statistics.ModelCount)))
            };

            result.AddRange(base.GetTabs(htmlHelper));
            return result;
        }

    }
}